package 子串

/*
书森学院
560. 和为 K 的子数组
给你一个整数数组 nums 和一个整数 k ，请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。

示例 1：
输入：nums = [1,1,1], k = 2
输出：2

示例 2：
输入：nums = [1,2,3], k = 3
输出：2
*/
func subarraySum(nums []int, k int) int {
	count, preSum := 0, 0 //声明计数和pre指针
	m := map[int]int{}    //声明map
	m[0] = 1              //前缀和为0的子数组, 有1种

	for i := 0; i < len(nums); i++ { //遍历数组
		preSum += nums[i]             //pre为累加值
		if _, ok := m[preSum-k]; ok { //查看当前前缀和-k的值, 能否在map种找到, 如果存在, 将情况种类累加
			count += m[preSum-k]
		}

		m[preSum] += 1 // 当前累加值在map种, 对应值+1
	}
	return count
}
